Hexo 博客的持续集成和部署(Travis-CI、Docker 和 Jenkins)

作者 Marlous 日期 2019-03-15
Hexo 博客的持续集成和部署(Travis-CI、Docker 和 Jenkins)

参考:
1、 Hexo的版本控制与持续集成
2、 使用 Travis-CI 持续集成部署 HEXO 博客项目
3、 用 Travis CI 自动部署 hexo
4、 使用 Git Hook 实现网站的自动部署
5、 持续集成服务 Travis CI 教程
6、 使用travis-ci自动部署github上的项目
7、 [小题大做] Github + Jenkins 实现自动化部署 hexo 博客静态文件
8、 ubuntu搭建Jenkins自动化部署服务

一 概述

  1. 实现原理(使用现成的 CI/CD 服务):
  • 从零开始,在本地部署环境、安装运行 Hexo 博客。
  • 新建一个中间存储文件夹。然后将此博客文件夹除环境部分源码复制到中间存储文件夹并 push 到一个 GitHub 中间存储仓库中。
  • 每次写博文直接在中间存储文件夹对应的 post 文件夹新建博文.md 和与博文同名存图片的文件夹即可。
  • 每次写完博文,直接提交到对应 GitHub 中间存储仓库即可(换台电脑就把 GitHub 上中间存储仓库拉下来)。
  1. 实现原理(自己用 Docker 搭建 CI/CD 服务):
  • 直接在远端自己的服务器上搭建一个完整的环境和可以运行 Hexo 后(docker),这个环境专门用来生成博客源码。
  • 只推送自己的博文文件夹到中间存储用的仓库。
  • docker 容器从中间存储用的仓库更新自己本地的 post 文件夹,并生成博客源码。
  • 将构建完后的博客源码推到博客仓库,或本地提供服务。
  1. 两者区别:
  • 前者相当于完全复制一份本地的博客相关源码到中间存储仓库,远端服务环境负责构建,然后推送博客源码部署。
  • 后者相当于直接将博客相关源码、环境建在远端,本地只留一个存博文的文件夹,通过中间存储仓库更新远端的 post 文件夹,然后远端构建,再推送博客源码部署(或直接在本地)。
  1. 先备份:
    1
    2
    3
    4
    5
    6
    scaffolds(文章模版)
    source(博客文章)
    themes(主题)
    .gitignore(限定在 push 时那些文件可以忽略)
    _config.yml(站点配置文件)
    package.json(安装包的名称)

二 使用现成的 CI/CD 服务

  • 本地已建好可运行的 Hexo 博客。

  • 将此博客文件夹中的部分文件复制到另一个中间存储文件夹(my-hexo-cicd)。

    1
    2
    3
    4
    5
    scaffolds(文章模版)
    source(博客文章)
    themes(主题) // 记得删除或复制需要的文件解决子仓库无法推送问题
    _config.yml(站点配置文件)
    package.json(安装包的名称)
  • 将中间存储文件夹(my-hexo-cicd)推送到远程中间存储仓库。

  • 登陆 Travis-CI,选择自己的(之前已经创建好私有仓库,我这里专门用一个私有仓库,没和 xxx.github.io 仓库放在一起)my-hexo-cicd 仓库,进入配置页面。/ 注意,在 http://travis-ci.org 你只能看到你的公开仓库;而在 http://travis-ci.com 你可以看你的私有仓库。

  • GitHub 生成一个 Access Token(除了删仓库权限,其它全给)。

  • Travis 配置中填入 Token(配置其它环境变量,可以起到加密作用;不配置写在 .travis.yml 文件中也行)。
    Travis 配置

  • 中间存储文件夹(my-hexo-cicd)根目录下写 .travis.yml 配置文件(在 GitHub 仓库页面创建。具体编写方法见网上的教程)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /*
    .travis.yml
    */

    language: node_js
    node_js:
    - "8.11.4"


    cache:
    directories:
    - node_modules


    # 一些依赖,每个人用的博客主题不同,依赖可能不同,后两个是我的博客需要的。
    install:
    - npm install -g hexo
    - npm install


    before_script:
    - npm install hexo-deployer-git --save
    - npm install hexo-asset-image --save


    script:
    - hexo clean
    - hexo g


    after_script:
    - cd ./public
    - git init
    - git config user.name "${U_NAME}"
    - git config user.email "${U_EMAIL}"
    - git add .
    - git commit -m "Update docs with TravisCI"
    - git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:${P_BRANCH}


    branches:
    only:
    - master
  • 向本地 my-hexo-cicd 文件夹中 source 中的 _post 文件夹添加博文后推送即可。

  • 补充:手动触发
    补充:手动触发

三 部署在远程 Docker 容器

这里使用的是阿里云的 ECS。
注意:需要配置开放安全组策略,全部 TCP! 80、443(选择)、8080、4000 端口。

1 概述

  • Hexo 的 CI/CD 持续集成和部署:把 nodejs 环境、Git、Jenkins 打包成 docker 镜像,然后在 VPS 上跑个容器,用 volumes 做数据持久化来保存部分配置。

  • 本地只维护一个博文仓库,push 到远端仓库,触发 webhook 后,Jenkins 拉完博文执行脚本进行构建,网站根目录设置成 hexo/public 即可。

2 已有 Hexo 博客(否则下一步)

  • 本地已搭建好的 Hexo,配好了自己的主题等,能正常运行。

  • 准备好自己博客的相关文件,复制到一个新文件夹中,使用 FTP 工具传到自己的服务器:

    1
    2
    3
    4
    5
    6
    7
    8
    scaffolds(文章模版)
    source(博客文章)
    themes(主题)
    _config.yml(站点配置文件)
    package.json(安装包的名称)

    --------------------------
    将新文件夹中 source(博客文章)里 _post 文件夹中的内容清空,防止之后文件冲突。

3 制作可以自动部署 hexo 的镜像

  • 基于 Ubuntu docker 镜像跑一个容器。(如果在本地制作镜像,制作完成后通过传输工具传到远程服务器上。不通过 Docker Hub 的话)。

    1
    docker run -it -p 80:80 -p 443:443 -p 8080:8080 -p 4000:4000 --name 容器名 镜像名 /bin/bash
  • 进入容器内安装软件、基础配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    apt update
    apt install software-properties-common

    // Java 相关
    add-apt-repository ppa:webupd8team/java
    apt update
    apt install oracle-java8-installer

    wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | apt-key add -
    sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
    apt-get update
    apt-get install jenkins

    apt install vim-gtk
    apt install nginx
    apt install git
    apt install nodejs
    apt install npm // 使用 apt-get install nodejs,npm 需要单独装

    cd /var/www/
    mkdir hexo
    cd hexo

    npm install -g hexo
    hexo init
    npm install

    hexo g // 可以用 hexo s 测试

    // 配置 Nginx
    vim /etc/nginx/sites-available/default
    /*
    将 nginx 配置到 hexo/public 到 80 或 443 端口。root /var/www/hexo/public;
    在启动 hexo 临时服务器后,即可访问 http://服务器的ip:4000/jenkins。
    */

    // 对 Jenkins 做最初的配置,防止以后权限问题构建失败。
    gpasswd -a root jenkins
    vim /etc/default/jenkins // JENKINS_USER="root" JENKINS_GROUP="root"
    service jenkins restart
  • 制作镜像:

    1
    docker commit 容器名 起个镜像名

4 实际使用镜像

  • 从制作好的镜像运行一个容器:

    1
    2
    3
    4
    5
    6
    docker volume create hexo

    docker run -it -p 80:80 -p 443:443 -p 8080:8080 -p 4000:4000 -v hexo:/var/www/hexo --name myhexo marlous/hexo /bin/bash

    service nginx start
    service jenkins start
  • 进行自己的私人配置(服务器):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    /*
    服务器已经装好所有环境。(docker 镜像 marlous/hexo)。
    本地已创建存放博文的仓库,并 push 到 GitHub 上。
    */


    /*
    服务器配置好了自己喜欢的博客主题。
    */
    可选配置 hexo 主题等(将自己之前博客的相关文件传到服务器,然后通过 volumes /var/lib/docker/volumes 传到相应位置,哪些文件见本章第一小节)。


    /*
    配置 Git。
    */
    git config --global user.name "you account name"
    git config --global user.email youemail@example.com
    ssh-keygen -t rsa -C "youemail@example.com" // 一路回车,生成 SSH 公钥,.pub 添加至 GitHub 网站,私钥填入 Jenkins。
    ssh git@github.com // 测试是否成功。


    /*
    本地博文仓库、远程博文仓库正常连接。
    */
    cd /var/www/hexo/source/_posts(清空,防止 Git 使用中出现问题)
    git init
    git remote add origin git@server-name:path/repo-name.git (自己的博文仓库先存个文件,如果没有的话)
    git pull origin master


    /*
    配置 Jenkins。
    */
    详见我的博文 《CI/CD 工具 Jenkins 的基本使用》。

5 补充

  • 可以将配置完的容器制作成镜像,下一换服务器直接传输镜像跑容器即可。但是这样会降低安全性(含有自己的公钥私钥,访问 GitHub 权限)。

  • 或者将其镜像放在 Docker 私有仓库。